/* 考虑从高到低依次确定答案的每一位。这时问题便转化为
    : 判断是否存在一个路径满足前
          位为给定状态，后面的位可以随便填。 因此对每条边，如果前
    : 位满足属于给定状态，那么就可以保留。因此把所有能保留的边留下看1和
          N是否连通即可，可以用并查集判断。时间复杂度
          O(nlog w)。 */
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;
int n, m, fa[N];
struct Edge {
  int u, v, w;
} e[N];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void merge(int x, int y) {
  x = find(x);
  y = find(y);
  if (x == y)
    return;
  fa[x] = y;
}
bool check(int x) {
  for (int i = 1; i <= n; ++i)
    fa[i] = i;
  for (int i = 1; i <= m; ++i)
    if ((e[i].w) | x == x)
      merge(e[i].u, e[i].v);
  return find(1) == find(n);
}
signed main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i)
    scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
  int ans = 0;
  for (int i = 30; i >= 0; --i)
    if (!check(ans | ((1 << i) - 1))) //
      ans |= (1 << i);                // 第i位只能是1
  printf("%d\n", ans);
  return 0;
}